
package tutorial.multicast;
import java.io.File;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.URI;
import java.net.URISyntaxException;

import net.jxta.document.AdvertisementFactory;
import net.jxta.id.IDFactory;
import net.jxta.peergroup.PeerGroup;
import net.jxta.pipe.PipeID;
import net.jxta.pipe.PipeService;
import net.jxta.platform.NetworkManager;
import net.jxta.protocol.PipeAdvertisement;
import net.jxta.socket.JxtaMulticastSocket;
/**
 * Simple example to illustrate the use of JxtaMulticastSocket
 */
public class JxtaMulticastSocketServer {
    private static PeerGroup netPeerGroup = null;
    public final static String SOCKETIDSTR = "urn:jxta:uuid-59616261646162614E5047205032503393B5C2F6CA7A41FDB0F890173088E79404";
    /**
	 * Creates a Socket Pipe Advertisement with the predefined pipe ID
	 * 
	 * @return a socket PipeAdvertisement
	 */
    public static PipeAdvertisement getSocketAdvertisement() {
         PipeID socketID = null;
         try {
             socketID = (PipeID) IDFactory.fromURI(new URI(SOCKETIDSTR));
         } catch (URISyntaxException use) {
             use.printStackTrace();
         }
         PipeAdvertisement advertisement = (PipeAdvertisement)
                 AdvertisementFactory.newAdvertisement(PipeAdvertisement.getAdvertisementType());
         advertisement.setPipeID(socketID);
         // set to type to propagate
         advertisement.setType(PipeService.PropagateType);
         advertisement.setName("Socket tutorial");
         return advertisement;
    }
    /**
	 * main
	 * 
	 * @param args
	 *            command line args
	 */
    public static void main(String args[]) {
         // Configures the JXTA platform
        net.jxta.platform.NetworkManager manager = null;
        try {
            manager = new net.jxta.platform.NetworkManager(NetworkManager.ConfigMode.ADHOC,
                     "JxtaMulticastSocketServer", new File(new File(".cache"),
"JxtaMulticastSocketServer").toURI());
            manager.startNetwork();
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(-1);
        }
        System.out.println("Creating JxtaMulticastSocket");
        JxtaMulticastSocket mcastSocket = null;
        try {
            mcastSocket = new JxtaMulticastSocket(manager.getNetPeerGroup(),
getSocketAdvertisement());
            System.out.println("LocalAddress :" + mcastSocket.getLocalAddress());
            System.out.println("LocalSocketAddress :" + mcastSocket.getLocalSocketAddress());
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }
        //byte[] buffer = new byte[16384];
        byte[] buffer = new byte[1638400001];
        String ten4 = "Ten 4";
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        try {
        	while(true) {
	            // wait for a datagram. The following can be put into a loop
        		mcastSocket.setSoTimeout(0);
	            mcastSocket.receive(packet);
	            String sw = new String(packet.getData(), 0, packet.getLength());
	            System.out.println("Received data from :" + packet.getAddress());
	            System.out.println(sw);
	            // unicast back a response back to the remote
//	            DatagramPacket res = new DatagramPacket(ten4.getBytes(), ten4.length());
//	            res.setAddress(packet.getAddress());
//	            mcastSocket.send(res);
        	}
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
